local E, L, V, P, G, _ = unpack(ElvUI); --Inport: Engine, Locales, PrivateDB, ProfileDB, GlobalDB, Localize Underscore
local AI = E:NewModule('AddonInstaller')

-- Upvalue for performance
local pairs, string, table, unpack, _G = pairs, string, table, unpack, _G
local string_find, string_format, string_gsub, string_sub, table_insert, table_remove
  = string.find, string.format, string.gsub, string.sub, table.insert, table.remove

-- A local database of addons
AI.addons = { }
AI.MyProfileKey = string_format('%s - %s', UnitName('player'), GetRealmName() )
AI.MyProfileName = "Shadow and Light"

-- Let's put all the RegEx stuff here
local regex_trim  = '^%s*(.-)%s*$'
local regex_match = '([ A-Za-z0-9_+*\\-]+)%s?,'

--[==[
  AddonInstaller:RegisterAddonProfile(name, ace3, dbname, onDemand)
  
  input:  (*optional)
  
    name        [string]
        The name name of the addon to use in the Command Args when enabling.
  
    ace3        [boolean]
        Indicator whether to treat this entry as an Ace3 compatible profile,
      or just some random entries into an addon's database.
  
    dbname      [string]
        The name of the addon's database (e.g. 'ElvCharacterDB')
        
    onDemand    [function]
        The function that will generate the "load on demand" profile.
        
  description:
      This function allows addon modules to register themselves so that they can get
    loaded when the user installs this UI.
  
  returns:
    nil
]==]
function AI:RegisterAddonProfile(name, ace3, dbname, onDemand)
	if not self.addons[name] then self.addons[name] = { } end
	table_insert(self.addons[name], { OnDemand = onDemand, dbname = dbname, ace3 = ace3 })
end

-- A private function that loads a specific addon database entry
local function LoadAddon(entry, profileName)
	local ADDON_DB = _G[entry.dbname]
	local myDB = entry.OnDemand(profileName)

	if ADDON_DB and myDB then
		if entry.ace3 then
			-- Profile will be: "Shadow and Light (Affinitii)"
			local profile = string_format('%s (%s)', AI.MyProfileName, profileName)

			-- If the addon is loaded AND the profile is Ace3, lets load it
			ADDON_DB.profiles[profile] = myDB                    -- Insert our new profile

			-- Set the profile as the default for this toon
			ADDON_DB.profileKeys[AI.MyProfileKey] = profile
		else
			for key, value in pairs(myDB) do
				ADDON_DB[key] = value
			end
		end
	end
end

--[==[
  AddonInstaller:LoadAddons(args)
  
  input: (*optional)
    args  [string]
        This is a comma separated list, where the first value is the profile that you
      want to load. The second arg can be "All" for all addons or the second and
      following args can list the addons one at a time.
      
        examples:
        
        1.  args = "Repooc, All"
          
            Loads all addons with the profile name "Repooc"
            
        2.  args = "Darth, Hermes, xCT+,"
        
            Loads Hermes and xCT+ addons with the profile name "Darth"
        
  description:
      This function was create to allow the loading of external addons profiles when a
    UI is installed.
  
  returns:
    nil
]==]

function AI:LoadAddons(args)
	-- This section of code parses the args
	local ListArgs = { }

	-- Trim the text (remove spaces), placed a nil check inside
	args = string_gsub(args or '', regex_trim, '%1')

	-- Add a comma onto the end
	if string_sub(args, #args) ~= ',' then
		args = args .. ','
	end

	local i, j = 0, 0
	while i do
		i, j = string_find(args, regex_match, j)    -- find all patterns that match 'Arg_1 Test+,'
		if i then
			-- Get the current pattern [ sub(index, length-1 ], trim all the spaces, and add it to the list of args
			local arg = string_gsub(string_sub(args, i, j-1), regex_trim, '%1')
			table_insert(ListArgs, arg)
		end
	end
	-- Args parsing completed!
  
	--[==[
	-- DEBUG: See what args I have :)
	for i, v in pairs(ListArgs) do
		print(i,'=',v)
	end
	]==]

	-- Get the profile name and see if we are loading All addons
	local profileName, LOAD_ALL = ( ListArgs[1] or 'default' ), ( ListArgs[2] == 'All' )
	table_remove(ListArgs, 1)  -- Remove the profile name, all we have left in the list are addons to load :)

	if LOAD_ALL then -- Load all the addons 
		for name, entryList in pairs(self.addons) do      -- Just load all the addons for this profile
			for _, entry in pairs(entryList) do             -- Loop through all the entries (could be multiple, like bigwigs)
				LoadAddon(entry, profileName)
			end
		end
	else  -- Load a specific set of addons 
		for _, name in pairs(ListArgs) do                 -- we need to figure out which addons to load
			local entryList = self.addons[name]
			for _, entry in pairs(entryList) do
				-- Check for addon name
				if entry then
					for _, entry in pairs(entryList) do           -- Loop through all the entries
						LoadAddon(entry, profileName)
					end
				else
					E:Print("  |cffFF0000ERROR:|r No Addon named '"..name.."' was found in the SLE addon configs.")
				end
			end
		end
	end
end